/**
 * monitors/ShortTermMonitor.js
 * 短期监控器（0-5分钟）
 * 职责：监控刚提交的任务，每10秒检查一次
 */

const { getTaskMonitor } = require('./TaskMonitor');

class ShortTermMonitor {
  constructor() {
    this.intervals = new Map(); // taskId -> intervalId
    this.CHECK_INTERVAL = 10000; // 10秒
    this.MAX_AGE = 5 * 60 * 1000; // 5分钟
  }

  /**
   * 启动短期监控
   * @param {string} taskId - 任务ID
   */
  start(taskId) {
    // 避免重复监控
    if (this.intervals.has(taskId)) {
      console.log(`任务 ${taskId} 短期监控已启动`);
      return;
    }

    const monitor = getTaskMonitor();
    monitor.startMonitoring(taskId, { type: 'short-term' });

    console.log(`🚀 启动短期监控: ${taskId} (每10秒检查)`);

    // 立即执行一次检查
    this.checkTask(taskId);

    // 设置定时器
    const intervalId = setInterval(async () => {
      await this.checkTask(taskId);
    }, this.CHECK_INTERVAL);

    this.intervals.set(taskId, {
      intervalId,
      startTime: Date.now()
    });

    // 5分钟后自动停止短期监控
    setTimeout(() => {
      this.stop(taskId);
      console.log(`⏰ 任务 ${taskId} 短期监控超时，移交给中期监控`);
    }, this.MAX_AGE);
  }

  /**
   * 检查任务
   * @param {string} taskId - 任务ID
   */
  async checkTask(taskId) {
    const monitor = getTaskMonitor();
    
    try {
      const task = await monitor.checkTask(taskId);
      
      // 如果任务已完成或失败，停止监控
      if (!task || task.status === 'completed' || task.status === 'failed') {
        this.stop(taskId);
      }
    } catch (error) {
      console.error(`短期监控检查失败 ${taskId}:`, error);
    }
  }

  /**
   * 停止短期监控
   * @param {string} taskId - 任务ID
   */
  stop(taskId) {
    const intervalInfo = this.intervals.get(taskId);
    
    if (intervalInfo) {
      clearInterval(intervalInfo.intervalId);
      this.intervals.delete(taskId);
      console.log(`⏹️ 停止短期监控: ${taskId}`);
    }
  }

  /**
   * 停止所有短期监控
   */
  stopAll() {
    for (const [taskId, intervalInfo] of this.intervals.entries()) {
      clearInterval(intervalInfo.intervalId);
    }
    this.intervals.clear();
    console.log('🧹 清理所有短期监控');
  }

  /**
   * 获取正在监控的任务数量
   * @returns {number}
   */
  getActiveCount() {
    return this.intervals.size;
  }
}

// 单例模式
let instance = null;

function getShortTermMonitor() {
  if (!instance) {
    instance = new ShortTermMonitor();
  }
  return instance;
}

module.exports = {
  ShortTermMonitor,
  getShortTermMonitor
};

